from urllib import parse
import requests
import sys
import json

"""
    上面的import语句用来导入系统内置库，以及第三方库requests
"""

# chat api: http://api.qingyunke.com/
URL_API = "http://api.qingyunke.com/api.php?key=free&appid=0&msg={0}"

"""
    这个函数的作用仅仅是输出我们的banner
"""


def print_banner():
    print(" __    __  .___  ___.   ______   ______ .______   ")
    print("|  |  |  | |   \/   |  /      | /      ||   _  \  ")
    print("|  |__|  | |  \  /  | |  ,----'|  ,----'|  |_)  | ")
    print("|   __   | |  |\/|  | |  |     |  |     |   _  <  ")
    print("|  |  |  | |  |  |  | |  `----.|  `----.|  |_)  | ")
    print("|__|  |__| |__|  |__|  \______| \______||______/  ")
    print('\n')
    print("欢迎进入简易聊天室".center(40, '+'))


"""
    desc:根据用户输入的单词，调用第三方API，获取内容并返回
"""


def get_reply(msg):
    # 拼接URL 由于输入内容可能包含有中文 需要调用parse.quote函数进行URLEncode
    url = URL_API.format(parse.quote(msg))
    reply = None
    try:
        # 使用requests库GET访问URL，并得到响应
        resp = requests.get(url)
        print(resp.text)
        # 将返回的txt内容转换为JSON对象
        obj = json.loads(resp.text)
        # 获取对象中的content字段并返回
        reply = obj['content']
    except:
        # 当调用request库函数遇到异常，比如网络中断、服务器未响应等情况时，会抛出异常
        # 为了良好的用户体验 这里捕获异常并返回一个默认的报错内容
        reply = "服务器开小差啦~"
    return reply


"""
    desc: 聊天主循环
"""


def start_robot():
    print_banner()
    # 由于python的print默认会换行，为了实现终端提示用户输入的效果，我们这里在输出>>后不换行，所以需要加一个end=""。
    # 可以在python交互式解释器中输入help(print)查看详细用法
    # flush=True的意思是，立刻将输出内容显示到终端。这是因为操作系统可能会对输出内容进行缓存，保存一定数量的输出内容后一次性输出到终端。
    print(">>", end="", flush=True)
    # 进入主循环
    while True:
        try:
            # 从标准输入中获取一行用户的输入内容，并去除两头的空格
            msg = sys.stdin.readline().strip()
        # 当用户按Ctrl+C退出循环时，会抛出此异常。为了优化体验，我们这里捕获这个异常，并打印再见。
        except KeyboardInterrupt:
            print("\n再见!")
            break
        if msg.lower() == 'bye':
            print("\n再见!")
            break
        # 如果用户没有输入内容直接按回车，那么我们继续打印终端提示符，等待用户输入
        if not msg:
            print(">>", end="", flush=True)
            # 结束当前循环，跳转到循环开始位置
            continue
        # 执行到这里时，已经获取到用户输入内容了，保存在msg中。
        # 我们将msg传入到函数get_reply中，获取第三方API的返回内容
        reply = get_reply(msg)
        print(">>" + reply)
        print(">>", end="", flush=True)


# 当我们用python chat_robot.py执行时，内置变量__name__会是__main__，
# 所以会进入if条件，调用start_robot()函数
if __name__ == '__main__':
    start_robot()
